// import type {
//   GeneratorManifest,
//   GeneratorOptions,
// } from '@prisma/generator-helper';

// import * as fs from 'fs';
// import * as path from 'node:path';

// import { DMMF } from '@prisma/generator-helper';
// import { generatorHandler } from '@prisma/generator-helper';
// import * as ejs from 'ejs';
// import * as prettierEslint from 'prettier-eslint';

// interface IValidClass {
//   name: string;
//   fields: IValidClassFields[];
// }

// interface IValidClassFields extends DMMF.Field {
//   decorates?: string[];
// }

// const FILENAME = 'prisma.dto.ts';
// generatorHandler({
//   onManifest(): GeneratorManifest | Promise<GeneratorManifest> {
//     return {
//       defaultOutput: './',
//     };
//   },
//   async onGenerate(options: GeneratorOptions) {
//     console.log('🚀 Running custom generator logic...');

//     const outputDir = options.generator.output?.value || './';
//     const outputPath = path.join(outputDir, FILENAME);
//     const dmmfModels = [...options.dmmf.datamodel.models];
//     const dmmfEnums = [...options.dmmf.datamodel.enums];
//     const { imports, models } = genModels(dmmfModels);
//     const enums = genEnums(dmmfEnums);
//     const dtoTemplate = fs.readFileSync('prisma/templates/dto.ejs', 'utf-8');
//     const dtoStr = ejs.render(dtoTemplate, { models, imports, enums });
//     const dtoPath = path.resolve(outputDir, FILENAME);
//     const dtoFormattedStr = await prettierEslint({
//       text: dtoStr,
//       filePath: dtoPath,
//     });

//     fs.mkdirSync(outputDir, { recursive: true });
//     fs.writeFileSync(outputPath, dtoFormattedStr);
//   },
// });

// const genModels = (data: DMMF.Model[]) => {
//   const validClass: IValidClass[] = [];
//   const imports = new Set<string>();
//   for (const item of data) {
//     const validClassFields: IValidClassFields[] = [];
//     for (const field of item.fields) {
//       const decorates: IValidClassFields['decorates'] = [];
//       if (!field.isRequired) {
//         decorates.push('@IsOptional()');
//         imports.add('IsOptional');
//       }

//       switch (field.type) {
//         case 'String':
//           decorates.push('@IsString()');
//           imports.add('IsString');
//           break;
//         case 'Number':
//         case 'Float':
//         case 'Int':
//           decorates.push('@IsNumber()');
//           imports.add('IsNumber');
//           break;
//         case 'Boolean':
//           decorates.push('@IsBoolean()');
//           imports.add('IsBoolean');
//           break;
//         case 'DateTime':
//           decorates.push('@IsDate()');
//           imports.add('IsDate');
//           break;
//         case 'Array':
//           decorates.push('@IsArray()');
//           imports.add('IsArray');
//           break;
//         default:
//           if (field.kind === 'object') {
//             decorates.push('@IsObject()');
//             imports.add('IsObject');
//           }
//           break;
//       }

//       const updatedField =
//         field.kind === 'object' ? { ...field, isRequired: false } : field;

//       validClassFields.push({
//         ...updatedField,
//         type: getType(updatedField),
//         decorates,
//       });
//     }
//     validClass.push({ name: item.name, fields: validClassFields });
//   }

//   return { models: validClass, imports: [...imports] };
// };

// /**
//  * 该枚举从@prisma/client中导入处理而不是生成一个enum
//  * 原因是Prisma生成的枚举数据是一个对象，否则传入curd会导致ts警告
//  * */
// const genEnums = (data: DMMF.DatamodelEnum[]) => {
//   return data.map((enumItem) => enumItem.name);
// };

// const getType = (item: IValidClassFields) => {
//   let baseType: string;

//   switch (item.type) {
//     case 'DateTime':
//       baseType = 'Date';
//       break;
//     case 'Float':
//     case 'Int':
//     case 'Decimal':
//       baseType = 'Number';
//       break;
//     case 'String':
//     case 'Boolean':
//       baseType = toPascalCase(item.type);
//       break;
//     default:
//       if (item.kind === 'object') {
//         baseType = `${toPascalCase(item.type)}Dto`;
//       } else if (item.kind === 'enum') {
//         baseType = item.type;
//       } else {
//         baseType = 'unknown';
//       }
//       break;
//   }

//   return item.isList ? `${baseType}[]` : baseType;
// };

// const toPascalCase = (str: string) =>
//   str.charAt(0).toUpperCase() + str.slice(1);
